/*
 *  Copyright 2015-2016, RenGu Technology (BeiJing) Co., Ltd.
 *  All right reserved.
 *
 *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF RENGU TECHNOLOGY (BeiJing) CO., LTD.
 *
 *  THE CONTENTS OF THIS FILE MAY NOT BE DISCLOSED TO THIR PARTIES,
 *  COPIED OR DUPLICATED IN ANY FORM, IN WHOLE OR IN PART,
 *  WITHOUT THE PRIOR WRITTEN PERMISSION OF RENGU TECHNOLOGY (BeiJing) CO., LTD.
 *
 *  AcctInfoMapper
 *
 *  Edit History:
 *      lizhangtao Created on 2020年04月08日
 *
 */
package cc.rengu.igas.acct.common.dao;

import cc.rengu.igas.acct.common.entity.AcctInfo;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.utility.util.DbsUtil;

/**
 * 账户信息表Dao
 *
 * @author lizhangtao
 * @date 2020年4月8日
 */
public interface AcctInfoMapper {

    /**
     * 插入账户信息表，数据库事务SQL执行
     *
     * @param acctInfo 账户信息表对应实体
     * @param dbs      数据库操作句柄
     * @return Database.DBS_SUCCESS成功，
     * Database.DBS_PKEY_DUPLICATE主键重复，违反唯一约束需要自己判断
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int insert2AcctInfo(AcctInfo acctInfo, DbsUtil dbs);

    /**
     * 插入账户信息表，数据库事务SQL执行
     *
     * @param acctInfo 账户信息表对应实体
     * @param dbs      数据库操作句柄
     * @return Database.DBS_SUCCESS成功，
     * Database.DBS_PKEY_DUPLICATE主键重复，违反唯一约束需要自己判断
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int insert2AcctInfoAndCommit(AcctInfo acctInfo, DbsUtil dbs);

    /**
     * 以账号查询账户信息表
     *
     * @param acctNo 客户id
     * @param instId 法人机构号
     * @param dbs    数据库操作句柄
     * @return 成功则返回账户信息实体对象，未查询到返回null
     * @throws BizException 其他失败抛出异常需要捕获处理
     */
    AcctInfo selectAcctInfoByAcctNo(String instId, String acctNo, DbsUtil dbs) throws BizException;

    /**
     * 以用户标识查询账户信息表
     *
     * @param userType 外部用户类型
     * @param userId   用户标识
     * @param instId   法人机构号
     * @param dbs      数据库操作句柄
     * @return 成功则返回账户信息实体对象，未查询到返回null
     * @throws BizException 其他失败抛出异常需要捕获处理
     */
    AcctInfo selectAcctInfoByUserId(String instId, String userType, String userId, DbsUtil dbs) throws BizException;

    /**
     * 以客户id查询账户信息表
     *
     * @param customerId 客户id
     * @param instId     法人机构号
     * @param dbs        数据库操作句柄
     * @return 成功则返回账户信息实体对象，未查询到返回null
     * @throws BizException 其他失败抛出异常需要捕获处理
     */
    AcctInfo selectAcctInfoByCustomerId(String instId, String customerId, DbsUtil dbs) throws BizException;

    /**
     * 以客户号更新账户状态
     * 用于事物begin和end之间
     *
     * @param instId     法人机构号
     * @param customerId 客户号
     * @param acctStatus 账户状态
     * @param dbs        数据库操作句柄
     * @return 成功返回Database.DBS_SUCCESS成功
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int updateAcctInfoStatusByCustomerId(String instId, String customerId, String acctStatus, DbsUtil dbs);

    /**
     * 以客户号锁定需要更新的记录
     *
     * @param instId     法人机构号
     * @param customerId 客户号
     * @param dbs        数据库操作句柄
     * @return 成功返回账户信息，失败返回null
     * @throws BizException 其他数据库错误及异常抛出异常
     */
    AcctInfo lockAcctInfoByCustomerId(String instId, String customerId, DbsUtil dbs) throws BizException;

    /**
     * 以外部用户类型及用户标识锁定需要更新的记录
     *
     * @param instId   法人机构号
     * @param userType 外部用户类型
     * @param userId   客户标识
     * @param dbs      数据库操作句柄
     * @return 成功返回账户信息，失败返回null
     * @throws BizException 其他数据库错误及异常抛出异常
     */
    AcctInfo lockAcctInfoByUserId(String instId, String userType, String userId, DbsUtil dbs) throws BizException;

    /**
     * 以账号锁定需要更新的记录
     *
     * @param instId 法人机构号
     * @param acctNo 账号
     * @param dbs    数据库操作句柄
     * @return 成功返回账户信息，失败返回null
     * @throws BizException 其他数据库错误及异常抛出异常
     */
    AcctInfo lockAcctInfoByAcctNo(String instId, String acctNo, DbsUtil dbs) throws BizException;

    /**
     * 冻结/冻结撤销
     *
     * @param instId           法人机构号
     * @param acctNo           账号
     * @param availableBalance 冻结后可用余额
     * @param freezeBalance    冻结后冻结金额
     * @param dbs              数据库句柄
     * @return 成功返回Database.DBS_SUCCESS成功
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int freezeAcctInfoByAcctNo(String instId, String acctNo, String availableBalance, String freezeBalance, DbsUtil dbs);

    /**
     * 解冻并借记
     *
     * @param instId        法人机构号
     * @param acctNo        账号
     * @param acctBalance   解冻并借记后账户余额
     * @param freezeBalance 解冻并借记后冻结余额
     * @param dbs           数据库句柄
     * @return 成功返回Database.DBS_SUCCESS
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int unfreezeAndDebitByAcctNo(String instId, String acctNo, String acctBalance, String freezeBalance, DbsUtil dbs);

    /**
     * 正常借贷记更新账户余额
     * 扣减或者增加由外部完成，更新余额、可用余额及更新时间
     *
     * @param instId           法人机构号
     * @param acctNo           账号
     * @param balance          更新后余额
     * @param availableBalance 更新后可用余额
     * @param dbs              数据库句柄
     * @return 成功返回Database.DBS_SUCCESS成功
     * 其他为数据库返回应答码失败
     * 数据库异常时返回Integer.MIN_VALUE
     */
    int updAcctBalByAcctNo(String instId, String acctNo, String balance, String availableBalance, DbsUtil dbs);
}
